package tempest.clients;
import java.util.Hashtable;
import java.util.LinkedList;
import tempest.primitives.*;

public class ClientList

{
  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  private static long clientId;
  private static LinkedList <PlayerClient> list;
  private static LinkedList <PlayerClient> removeList;
  private static Hashtable <MudString, Client> clientTable;

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  static boolean contains(PlayerClient c)       { return list.contains(c);    }
  static PlayerClient getClient(int i)          { return list.get(i);         }
  static int clientCount()                      { return list.size();         }
  static void queueClientRemove(PlayerClient c) { removeList.add(c);          }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public static void addClient(PlayerClient c)

  {
    clientTable.put(c.uniqueId(), c);
    list.add(c);
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  static MudString generateId()

  {
    MudString id = new MudString();
    id.set(String.valueOf(clientId++));
    return id;
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  static boolean isLoggedIn(MudString s)

  {
    return (clientTable.get(s) != null);
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  static Client findClient(MudString s)

  {
    Client C = clientTable.get(s);
    if (C == null) return clientTable.get("MobileClient");
    return C;
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public static void init()

  {
    list = new LinkedList <PlayerClient> ();
    removeList = new LinkedList <PlayerClient> ();
    clientTable = new Hashtable <MudString, Client> ();
    clientTable.put(new MudString("MobileClient"), new MobileClient());
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  static void processRemoveQueue()

  {
    for (PlayerClient C : removeList)

    {
      list.remove(C);
      clientTable.remove(C);
    }

    removeList.clear();
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////

  public static void spin()

  {
    for (PlayerClient C : list)

    {
      C.processInput();
      C.handleInput();
      C.handleOutput();
    }

    processRemoveQueue();
  }

  /////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////
}